﻿/*
7-53 两个有序序列的中位数 (25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​ ,A​1​​ ,⋯,A​N−1​​ 的中位数指A​(N−1)/2​​ 的值,即第⌊(N+1)/2⌋个数（A​0​​ 为第1个数）。

输入格式:
输入分三行。第一行给出序列的公共长度N（0<N≤100000），随后每行输入一个序列的信息，即N个非降序排列的整数。数字用空格间隔。

输出格式:
在一行中输出两个输入序列的并集序列的中位数。

输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4
输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
*/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "array_int.h"

#define MAXSIZE 100002

Array read_list(int n) {
	Array a = array_create(n + 1);
	int data;
	for (int i = 0; i < n; i++) {
		scanf("%d", &data);
		array_push(a, data);
	}
	array_set(a, a->last + 1, ERROR);
	return a;
}

Array list_union(Array a, Array b) {
	Array c = array_create(array_size(a) + array_size(b) + 2);
	ArrayElementType *da = a->data;
	ArrayElementType* db = b->data;
	ArrayElementType* aend = array_end(a);
	ArrayElementType* bend = array_end(b);
	while (da!=aend && db!=bend) {
		if (*da <= *db) 
			array_push(c, *da++);
		else 
			array_push(c, *db++);
	}
	while (da != aend)
		array_push(c, *da++);
	while (db != bend)
		array_push(c, *db++);

	array_set(c, c->last + 1, ERROR);
	return c;
}

void resolve() {
	int n;
	scanf("%d", &n);
	Array a = read_list(n);
	Array b = read_list(n);
	Array c = list_union(a, b);

	/*
	print_array(a);
	print_array(b);
	print_array(c);
	//*/
	printf("%d\n", c->data[c->last  / 2]);

	array_free(a);
	array_free(b);
	array_free(c);
}

int main() {
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/PTA_DS_CN/7_53.txt", "r", stdin);
	resolve();
	return 0;
}